package com.fun.jvm;

import java.lang.ref.WeakReference;

public class WeakReferenceExample {
    public static void main(String[] args) throws InterruptedException {
        // 10M 的缓存数据
        byte[] cacheData = new byte[10 * 1024 * 1024];

        // 将缓存数据用软引用持有
        final WeakReference<byte[]> cacheRef = new WeakReference<>(cacheData);

        System.out.println("第一次 GC 前 {}"+(cacheData == null));
        System.out.println("第一次 GC 前 {}"+(cacheRef.get() == null));

        // 进行一次 GC 后查看对象的回收情况
        System.gc();
        Thread.sleep(1000); // 等待 GC
        System.out.println("第一次 GC 后 {}"+(cacheData == null));
        System.out.println("第一次 GC 后 {}"+(cacheRef.get() == null));

        // 将缓存数据的强引用去除，你没有用了
        cacheData = null;
        System.gc();
        Thread.sleep(1000); //等待 GC
        System.out.println("第二次 GC 后 {}"+(cacheData == null));
        System.out.println("第二次 GC 后 {}"+(cacheRef.get() == null));
    }
}
